svgtypes 0.1.1

SVG types parser and writer.
Documentation

svgtypes

Build Status Crates.io Documentation

svgtypes is a collection of parsers, containers and writers for SVG types.

Usage is simple as:

use svgtypes::Path;

let path: Path = "M10-20A5.5.3-4 110-.1".parse().unwrap();
assert_eq!(path.to_string(), "M 10 -20 A 5.5 0.3 -4 1 1 0 -0.1");

You can also use a low-level, pull-based parser:

use svgtypes::PathParser;

let p = PathParser::from("M10-20A5.5.3-4 110-.1");
for token in p {
    println!("{:?}", token);
}

You can also tweak an output format:

use svgtypes::{Path, WriteBuffer, WriteOptions};

let path_str = "M10-20A5.5.3-4 110-.1";
let path: Path = path_str.parse().unwrap();

let opt = WriteOptions {
    remove_leading_zero: true,
    use_compact_path_notation: true,
    join_arc_to_flags: true,
    .. WriteOptions::default()
};

assert_eq!(path.with_write_opt(&opt).to_string(), path_str);

Supported SVG types

SVG Type Rust Type Storage Parser
<color> Color Stack
<number> f64 Stack
<length> Length Stack
<viewBox> ViewBox Stack
<path> Path Heap PathParser
<list-of-numbers> NumberList Heap NumberListParser
<list-of-lengths> LengthList Heap LengthListParser
<transform-list> Transform Stack TransformListParser
<list-of-points> Points Heap PointsParser
<style> - - StyleParser
<paint> - - Paint
  • All types implement from string (FromStr, FromSpan) and to string traits (Display, WriteBuffer).
  • The library doesn't store transform list as is. It will premultiplied.
  • style and paint types can only be parsed.

Benefits

  • Complete support of paths, so data like M10-20A5.5.3-4 110-.1 will be parsed correctly.
  • Every type can be parsed separately, so you can parse just paths or transform or any other SVG value.
  • Good error processing. All error types contain position (line:column) where it occurred.
  • Access to pull-based parsers.
  • Pretty fast.

Limitations

  • All keywords must be lowercase. Case-insensitive parsing is supported only for colors (requires allocation for named colors).
  • The <color> followed by the <icccolor> is not supported. As the <icccolor> itself.
  • CSS styles does not processed. You should use an external CSS parser.
  • Comments inside attributes value supported only for the style attribute.
  • System colors, like fill="AppWorkspace", are not supported.
  • There is no separate coordinate type. It will be parsed as <length>,
  • There is no separate opacity-value type. It will be parsed as <number>, but will be bound to 0..1 range.
  • Implicit path commands are not supported. All commands are parsed as explicit.
  • Implicit MoveTo commands will be automatically converted into explicit LineTo.

Safety

  • The library should not panic. Any panic considered as a critical bug and should be reported.
  • The library forbids unsafe code.

Alternatives

None.

Migration from svgparser

This crate is a successor for the svgparser crate, but it differs from it in many ways.

  • There is no XML parser or writer. You can use any you like. But since it depends on xmlparser and reexports it - you can use it too.
  • Unlike the svgparser this crate not only parse values but can also store and write them. Currently, it has a minimal API for manipulating this values.
  • No AttributeValue. This crate provides only value parsers. You should match attributes and values by yourself.
  • No ValueId. It's up to you how to store those values.

Usage

Dependency: Rust >= 1.18

Add this to your Cargo.toml:

[dependencies]
svgtypes = "0.1"

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.